home *** CD-ROM | disk | FTP | other *** search
/ AMIGA-CD 2 / Amiga-CD - Volume 2.iso / ungepackte_daten / 1993 / 3 / 02 / screenrequester / screenrequester.ampk / Screenrequester / SRequest.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-06-01  |  12.9 KB  |  341 lines

  1. /* Programmautor: Rainer Zeitler
  2.  * Programm für Lattice-C
  3.  * Compiler-Optionen: lc -Lt screenmodes.c
  4.  */
  5. #include <exec/types.h>
  6. #include <exec/memory.h>
  7. #include <graphics/gfx.h>
  8. #include <graphics/display.h>
  9. #include <graphics/displayinfo.h>
  10. #include <libraries/gadtools.h>
  11. #include <intuition/intuition.h>
  12. #include <intuition/intuitionbase.h>
  13. #include <intuition/gadgetclass.h>
  14. #include <clib/exec_protos.h>
  15. #include <clib/intuition_protos.h>
  16. #include <clib/graphics_protos.h>
  17.  
  18. struct GfxBase *GfxBase=NULL;
  19. struct IntuitionBase *IntuitionBase=NULL;
  20. struct Library *GadToolsBase=NULL;
  21. struct DiskfontBase *DiskfontBase=NULL;
  22.  
  23. static struct Screen *ModeScreen=NULL;
  24. static struct Window *ModeWindow=NULL;
  25. static APTR VisualInfo = NULL;
  26. static struct Gadget *GList = NULL;
  27. static struct TextAttr topaz8 = {
  28.      (STRPTR)"topaz.font", 8, 0x00, 0x00 };
  29. static struct TextFont *ModesFont=NULL;
  30. static struct Gadget *ModeGadgets[5];
  31. static struct IntuiMessage ModeMsg;
  32. static char *Answer[] = { "Ja","Nein" };
  33. static ULONG ModeID=0, DepthID=2;
  34. static struct DisplayNode {
  35.   struct Node dn_Node;
  36.   struct DimensionInfo diminfo;
  37.   struct DisplayInfo dispinfo;
  38.   ULONG  modeID;
  39. };
  40.  
  41. static struct List *DispList = NULL;
  42. static struct TagItem WindowTags[] = {
  43.   WA_Left, 45, WA_Top, 63, WA_Width, 450, WA_Height, 205,
  44.   WA_IDCMP, BUTTONIDCMP|LISTVIEWIDCMP,
  45.   WA_Flags,  WFLG_DRAGBAR|WFLG_DEPTHGADGET|WFLG_ACTIVATE,
  46.   WA_Gadgets, 0l, WA_Title, (ULONG)"Verfügbare Screen-Modi",
  47.   WA_CustomScreen,  0l, TAG_DONE };
  48.  
  49. static struct TagItem ScreenTags[] = {
  50.   SA_Left, 0, SA_Top, 0, SA_Width, STDSCREENWIDTH,
  51.   SA_Height, STDSCREENHEIGHT, SA_Depth, 2,
  52.   SA_Type, CUSTOMSCREEN, SA_DisplayID, 593925,
  53.   TAG_DONE };
  54.  
  55. void RefreshAnzeige(struct DisplayNode *node) {
  56.   struct RastPort *rp=(struct RastPort *)ModeWindow->RPort;
  57.   struct DimensionInfo *mdinfo=&(node->diminfo);
  58.   struct DisplayInfo *dispinfo=&(node->dispinfo);
  59.   char *name=node->dn_Node.ln_Name, dummy[50];
  60.   WORD Top=ModeScreen->BarHeight+2;
  61.   SetAPen(rp,0); SetDrMd(rp,JAM1);
  62.   RectFill( rp, 224, Top+2, 224+216 , Top+90 );
  63.   SetAPen(rp,2); Top+=9; Move( rp, 224,  Top);
  64.   if( TextLength(rp,name,strlen(name)) > 216 ) {
  65.     long i=strlen(name)-1;
  66.     while( i ) {
  67.       if( TextLength(rp,name,i) <= 216 ) break;
  68.       else i--;
  69.     }
  70.     Text( rp, name,i);
  71.   } else Text( rp, name,strlen(name));
  72.   Top+=8; SetDrMd(rp,JAM1); SetAPen(rp,1);
  73.   sprintf(dummy,"Max. Farben: %d",1 << (mdinfo->MaxDepth-1));
  74.   Move( rp, 224,Top ); Text( rp, dummy,strlen(dummy)); Top+=8;
  75.   sprintf(dummy,"Breite:%d, Höhe:%d",mdinfo->Nominal.MaxX-
  76.              mdinfo->Nominal.MinX+1, mdinfo->Nominal.MaxY-
  77.              mdinfo->Nominal.MinY+1);
  78.   Move( rp, 224, Top ); Text( rp, dummy,strlen(dummy));
  79.   Top+=10; SetAPen(rp,3);
  80.   sprintf(dummy,"Standard-Overscan:");
  81.   Move( rp, 224, Top);  Text( rp, dummy,strlen(dummy));
  82.   Top+=8; SetAPen(rp,1);
  83.   sprintf(dummy,"Breite:%d, Höhe:%d",mdinfo->StdOScan.MaxX-
  84.              mdinfo->StdOScan.MinX+1,mdinfo->StdOScan.MaxY-
  85.              mdinfo->StdOScan.MinY+1);
  86.   Move( rp, 224, Top);  Text( rp, dummy,strlen(dummy));
  87.   Top+=8; SetAPen(rp,3); sprintf(dummy,"Maximaler Overscan:");
  88.   Move( rp, 224, Top);  Text( rp, dummy,strlen(dummy));
  89.   Top+=8; SetAPen(rp,1);
  90.   sprintf(dummy,"Breite:%d, Höhe:%d",mdinfo->MaxOScan.MaxX-
  91.              mdinfo->MaxOScan.MinX+1,mdinfo->MaxOScan.MaxY-
  92.              mdinfo->MaxOScan.MinY+1);
  93.   Move( rp,224,Top );Text( rp, dummy,strlen(dummy));Top+=10;
  94.   sprintf(dummy,"ECS-Modus? %s",dispinfo->PropertyFlags&
  95.                        DIPF_IS_ECS?Answer[0]:Answer[1]);
  96.   Move( rp,224,Top );Text( rp, dummy,strlen(dummy)); Top+=8;
  97.   sprintf(dummy,"Interlace-Modus? %s",dispinfo->PropertyFlags&
  98.                             DIPF_IS_LACE?Answer[0]:Answer[1]);
  99.   Move( rp,224,Top );Text( rp, dummy,strlen(dummy)); Top+=8;
  100.   sprintf(dummy,"Verschiebbar? %s",dispinfo->PropertyFlags&
  101.                     DIPF_IS_DRAGGABLE?Answer[0]:Answer[1]);
  102.   Move( rp,224,Top ); Text( rp, dummy,strlen(dummy));
  103. }
  104. /* Sucht der nr-ten Eintrag */
  105. struct DisplayNode *FindNode(long nr) {
  106.   struct DisplayNode *dnode = DispList->lh_Head;
  107.   while( nr-- > 0 )
  108.      dnode = (struct DisplayNode *) dnode->dn_Node.ln_Succ;
  109.   return dnode;
  110. }
  111. /* Diese Funktion wird angesprungen, wenn ein neuer Screen- *
  112.  * Modus angewählt wurde                                    */
  113. int Modus(void) {
  114.   struct DisplayNode *node=FindNode(ModeMsg.Code);
  115.   struct DimensionInfo *dinfo;
  116.   RefreshAnzeige(node);
  117.   dinfo=&(node->diminfo);
  118.   GT_SetGadgetAttrs(ModeGadgets[3],ModeWindow,NULL,GTSL_Min,
  119.                     0,GTSL_Max,dinfo->MaxDepth-1, GTSL_Level,
  120.                     dinfo->MaxDepth-1, TAG_DONE);
  121.   GT_SetGadgetAttrs(ModeGadgets[4],ModeWindow,NULL,
  122.               GTNM_Number,1 << (dinfo->MaxDepth-1),TAG_DONE);
  123.   DepthID=dinfo->MaxDepth;
  124.   ModeID=node->modeID;
  125.   return 1;
  126. }
  127. /* Diese Funktion wird angesprungen, wenn die Anzahl der *
  128.  * Farben modifiziert wurde                              */
  129. int Slider(void) {
  130.   GT_SetGadgetAttrs(ModeGadgets[4],ModeWindow,NULL,
  131.                      GTNM_Number,1 << ModeMsg.Code,TAG_DONE);
  132.   return 1;
  133. }
  134. /* OK-Gadget ausgewählt */
  135. int OK(void) { return 2; }
  136. /* Abbruch-Gadget ausgewählt */
  137. int Abbruch(void) { return 0; }
  138. /* Den reservierten Speicher für die Exec-Liste freigeben */
  139. static void FreeScreenModes() {
  140.   struct DisplayNode *wnode, *nnode;
  141.   wnode = (struct DisplayNode *) DispList->lh_Head;
  142.   while(nnode=(wnode->dn_Node.ln_Succ)) {
  143.     if(wnode->dn_Node.ln_Name)
  144.       FreeMem(wnode->dn_Node.ln_Name,
  145.                  strlen(wnode->dn_Node.ln_Name) +1);
  146.     Remove((struct Node *) wnode);
  147.     FreeMem(wnode, sizeof(struct DisplayNode));
  148.     wnode = nnode;
  149.   }
  150.   FreeMem(DispList, sizeof(struct List));
  151. }
  152. /* Diese Funktion durchsucht die interne Datenbank der *
  153.  * Screen-Modi und erzeugt eine verkettet Exec-Liste   */
  154. static BOOL ScanModes( void ) {
  155.   struct DisplayInfo dinfo;
  156.   struct NameInfo    ninfo;
  157.   struct DisplayNode *dnode;
  158.   ULONG modeID=INVALID_ID;
  159.   if( (DispList=AllocMem(sizeof(struct List),
  160.                    MEMF_CLEAR|MEMF_PUBLIC)) != NULL ) {
  161.     NewList( DispList );
  162.     while((modeID=NextDisplayInfo(modeID))!=INVALID_ID) {
  163.       if( GetDisplayInfoData(NULL,(UBYTE *)&dinfo,
  164.                  sizeof(dinfo),DTAG_DISP,modeID) != 0 ) {
  165.         if( (dinfo.NotAvailable == 0) &&
  166.                            (modeID & MONITOR_ID_MASK) ) {
  167.           /* Hier gelangt das Programm nur dann hin, wenn
  168.            * der Modus verfügbar ist und nicht der
  169.            * Default-Monitor benötigt wird, sondern ein
  170.            * PAL-, NTSC- oder andere Monitore          */
  171.           if( GetDisplayInfoData(NULL,(UBYTE *)&ninfo,
  172.                  sizeof(ninfo),DTAG_NAME,modeID) != 0 ) {
  173.             if( (dnode=AllocMem(sizeof(struct DisplayNode),
  174.                      MEMF_CLEAR|MEMF_PUBLIC)) != NULL ) {
  175.               if( (dnode->dn_Node.ln_Name=
  176.                     AllocMem(strlen(ninfo.Name)+1,
  177.                      MEMF_CLEAR|MEMF_PUBLIC)) != NULL ) {
  178.                 strcpy(dnode->dn_Node.ln_Name, ninfo.Name);
  179.                 GetDisplayInfoData(NULL, (UBYTE *)
  180.                  &(dnode->diminfo),sizeof(struct DimensionInfo),
  181.                  DTAG_DIMS, modeID);
  182.                 GetDisplayInfoData(NULL, (UBYTE *)
  183.                  &(dnode->dispinfo),sizeof(struct DisplayInfo),
  184.                  DTAG_DISP, modeID);
  185.                 dnode->modeID = modeID;
  186.                 AddTail(DispList, (struct Node *) dnode);
  187.               }
  188.             }
  189.           }
  190.         }
  191.       }
  192.     }
  193.     return TRUE;
  194.   }
  195.   return FALSE;
  196. }
  197. /* Öffnen des Fensters auf dem gerade aktiven Screen */
  198. static BOOL InitWindow() {
  199.   struct NewGadget ng;
  200.   struct Gadget *g;
  201.   WindowTags[ 8 ].ti_Data = (ULONG)ModeScreen;
  202.   WindowTags[ 3 ].ti_Data = ModeScreen->BarHeight+1+140;
  203.   WindowTags[0].ti_Data=ModeScreen->Width/2-
  204.                                 WindowTags[2].ti_Data/2;
  205.   WindowTags[1].ti_Data=ModeScreen->Height/2-
  206.                                 WindowTags[3].ti_Data/2;
  207.   if( ( VisualInfo = (APTR)GetVisualInfo(ModeScreen,
  208.                      TAG_DONE )) == NULL)  return FALSE;
  209.   if( ( g = (struct Gadget *)CreateContext( &GList )) ==
  210.                                     NULL ) return FALSE;
  211.   ng.ng_LeftEdge=8;ng.ng_TopEdge=ModeScreen->BarHeight+2;
  212.   ng.ng_Width=210;ng.ng_Height=98;ng.ng_GadgetText=NULL;
  213.   ng.ng_TextAttr=&topaz8;ng.ng_GadgetID=0;ng.ng_Flags=0;
  214.   ng.ng_VisualInfo=VisualInfo;ng.ng_UserData=(APTR)Modus;
  215.   g=(struct Gadget *)CreateGadget( LISTVIEW_KIND, g, &ng,
  216.          GTLV_Labels, (ULONG)DispList, GTLV_ShowSelected,
  217.          0l, TAG_DONE );
  218.   ModeGadgets[ 0 ] = g;
  219.   ng.ng_Height = 19; ng.ng_GadgetText = "Übernehmen";
  220.   ng.ng_TopEdge = WindowTags[3].ti_Data - ng.ng_Height-5;
  221.   ng.ng_Width = 126; ng.ng_GadgetID = 1;
  222.   ng.ng_Flags = PLACETEXT_IN; ng.ng_UserData=(APTR)OK;
  223.   g = (struct Gadget *)CreateGadget(BUTTON_KIND,
  224.                                         g,&ng,TAG_DONE );
  225.   ModeGadgets[ 1 ] = g; if ( g == NULL ) return FALSE;
  226.   ng.ng_LeftEdge = 442-ng.ng_Width;
  227.   ng.ng_GadgetText = "Abbruch"; ng.ng_GadgetID = 2;
  228.   ng.ng_UserData=(APTR)Abbruch;
  229.   g = (struct Gadget *)CreateGadget( BUTTON_KIND,
  230.                                       g, &ng, TAG_DONE );
  231.   ModeGadgets[ 2 ] = g; if ( g == NULL ) return FALSE;
  232.   ng.ng_UserData=(APTR)Slider; ng.ng_Height = 10;
  233.   ng.ng_Flags = PLACETEXT_LEFT;  ng.ng_LeftEdge = 8+9*8;
  234.   ng.ng_GadgetText = "Farben: "; ng.ng_GadgetID = 3;
  235.   ng.ng_TopEdge=ng.ng_TopEdge-15;
  236.   ng.ng_Width=WindowTags[2].ti_Data-ng.ng_LeftEdge-50;
  237.   g = (struct Gadget *)CreateGadget( SLIDER_KIND,
  238.       g, &ng, GTSL_Max, 2, GTSL_MaxLevelLen,2,PGA_Freedom,
  239.       LORIENT_HORIZ,GA_RelVerify, TRUE,TAG_DONE );
  240.   ModeGadgets[ 3 ] = g; if ( g == NULL ) return FALSE;
  241.   ng.ng_Flags = 0; ng.ng_LeftEdge = 442-4*8;
  242.   ng.ng_GadgetText = NULL; ng.ng_Width=4*8;
  243.   ng.ng_GadgetID = 4; ng.ng_UserData=(APTR)NULL;
  244.   g = (struct Gadget *)CreateGadget( NUMBER_KIND,
  245.      g, &ng, GTNM_Number, 2, GTNM_Border, TRUE,TAG_DONE );
  246.   ModeGadgets[ 4 ] = g; if ( g == NULL ) return FALSE;
  247.   WindowTags[ 6 ].ti_Data = (ULONG)GList;
  248.   ModeWindow = OpenWindowTagList( NULL, WindowTags );
  249.   if( ModeWindow == NULL ) return FALSE;
  250.   GT_RefreshWindow( ModeWindow, NULL );
  251.   DrawBevelBox( ModeWindow->RPort, 222,
  252.                 ModeScreen->BarHeight+2, 220, 92,
  253.                 GT_VisualInfo, VisualInfo, TAG_DONE );
  254.   GT_SetGadgetAttrs(ModeGadgets[0],ModeWindow,NULL,
  255.                             GTLV_Selected,0,TAG_DONE);
  256.   ModeMsg.Code=0; Modus();
  257.   return TRUE;
  258. }
  259. /* Schließen des Fensters und Freigabe benötigter *
  260.  * Ressourcen                                     */
  261. void RemoveWindow( void ) {
  262.   if( ModeWindow ) CloseWindow( ModeWindow );
  263.   if( GList ) FreeGadgets( GList );
  264.   if( VisualInfo ) FreeVisualInfo( VisualInfo );
  265. }
  266. /* Beantworten einer eingegangenen IDCMP-Message und *
  267.  * verzweigen zur entsprechenden Funktion, die im    *
  268.  * Element UserData der Gadget-Struktur eingetragen  *
  269.  * ist.                                              */
  270. int HandleIDCMP( void ) {
  271.   struct IntuiMessage *msg;
  272.   int (*func)(), ready = 1;
  273.   if( (msg = (struct IntuiMessage *)
  274.        GT_GetIMsg( ModeWindow->UserPort)) != NULL ) {
  275.     CopyMem(( char * )msg, ( char * )&ModeMsg,
  276.                 (long)sizeof( struct IntuiMessage ));
  277.     GT_ReplyIMsg( msg );
  278.     switch ( ModeMsg.Class ) {
  279.       case IDCMP_GADGETUP:
  280.       case IDCMP_GADGETDOWN:
  281.            func=(void *)((struct Gadget *)ModeMsg.IAddress)
  282.                 ->UserData;
  283.            ready = func();
  284.            break;
  285.       default:
  286.            break;
  287.     }
  288.   }
  289.   return ready;
  290. }
  291. /* Warten auf das Eintreffen einer Nachricht am Port */
  292. int HandleWindow(void) {
  293.   int res;
  294.   do {
  295.     WaitPort( ModeWindow->UserPort );
  296.   } while( (res=HandleIDCMP()) == (int)1);
  297.   return res;
  298. }
  299. main()
  300. {
  301.   struct Screen *myscreen;
  302.   GfxBase=OpenLibrary("graphics.library",37L);
  303.   IntuitionBase=(struct IntuitionBase *)
  304.                  OpenLibrary("intuition.library",37L);
  305.   GadToolsBase=OpenLibrary("gadtools.library",37L);
  306.   DiskfontBase=OpenLibrary("diskfont.library",37L);
  307.   if( GfxBase && IntuitionBase &&
  308.       GadToolsBase && DiskfontBase ) {
  309.     if( (ModesFont = OpenFont(&topaz8)) == NULL ) {
  310.       if( (ModesFont = OpenDiskFont(&topaz8)) != NULL )
  311.         AddFont( ModesFont );
  312.     }
  313.     if( ModesFont ) {
  314.       if( ScanModes() ) {
  315.         ModeScreen=IntuitionBase->ActiveScreen;
  316.         if( InitWindow() )
  317.           if( HandleWindow() == 2 ) {
  318.             /* OK-Gadget wurde angeklickt. In ModeID finden
  319.              * wir die ModeID, in DepthID die Anzahl der
  320.              * Bitplanes. Die Daten müssen noch in die Tags
  321.              * eingetragen werden, dann kann der Schirm
  322.              * geöffnet werden */
  323.              ScreenTags[6].ti_Data=ModeID;
  324.              ScreenTags[4].ti_Data=DepthID;
  325.              myscreen=OpenScreenTagList(NULL,&ScreenTags);
  326.              if( myscreen ) {
  327.                Delay( 5 * 50 );
  328.                CloseScreen( myscreen );
  329.              }
  330.           }
  331.         RemoveWindow();
  332.       }
  333.       FreeScreenModes();
  334.     }
  335.   }
  336.   if( GfxBase ) CloseLibrary( GfxBase );
  337.   if( IntuitionBase ) CloseLibrary( IntuitionBase );
  338.   if( GadToolsBase ) CloseLibrary( GadToolsBase );
  339.   if( DiskfontBase ) CloseLibrary( DiskfontBase);
  340. }
  341.